﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Biciq.Logica;
using System.Net.Mail;
using System.Configuration;
using Biciq.Datos;
using System.Web;
using System.IO;
using DocumentFormat.OpenXml.Packaging;
using System.ComponentModel;

namespace Biciq.Logica
{
    public class Comun
    {
        public static string encript(string stringToEncript)
        {
            System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] bs = System.Text.Encoding.UTF8.GetBytes(stringToEncript);
            bs = x.ComputeHash(bs);
            System.Text.StringBuilder s = new System.Text.StringBuilder();
            foreach (byte b in bs)
            {
                s.Append(b.ToString("x2").ToLower());
            }
            string md5 = s.ToString();
            return md5;
        }

        /// <summary>
        /// Metodo que envia correos electronicos 
        /// </summary>
        /// <param name="email">correo electronico</param>
        /// <param name="subject">Asunto</param>
        /// <param name="body">Contexto</param>
        /// <param name="adjunto1">Archivo adjunto 1</param>
        /// <param name="adjunto2">archivo adjunto 2</param>
        /// <returns></returns>
        public static Result enviarCorreo(string email, string subject, string body, Attachment adjunto1 =null, Attachment adjunto2=null)
        {
            Result result = new Result();
            result.estado = true;
            result.mensaje = "Ok";
            MailMessage mailMessage = new MailMessage();

            if (email != "")
            {
                mailMessage.To.Add(email);
                mailMessage.CC.Add((new AppSettingsReader()).GetValue("MailAdministrator", email.GetType()).ToString());
            }
            else
            {
                mailMessage.To.Add((new AppSettingsReader()).GetValue("MailAdministrator", email.GetType()).ToString());
            }
            mailMessage.Body = body;
            mailMessage.Sender = new MailAddress((new AppSettingsReader()).GetValue("MailAdministrator", email.GetType()).ToString());
            mailMessage.Subject = subject;
            mailMessage.Priority = MailPriority.Normal;
            mailMessage.From = new MailAddress("Administrador@biciq.gob.ec");

            SmtpClient smtpClient = new SmtpClient();
            smtpClient.Host = (new AppSettingsReader()).GetValue("SMPTServer", email.GetType()).ToString();
           
            //smtpClient.Port = Convert.ToInt32((new AppSettingsReader()).GetValue("SMPTPort", email.GetType()));

            bool usar = true;

            var usarCredenciales = Convert.ToBoolean(new AppSettingsReader().GetValue("UsarCredencialesSMTP", usar.GetType()));

            if (usarCredenciales)
            {
                smtpClient.Credentials = new System.Net.NetworkCredential((new AppSettingsReader()).GetValue("SMPTUser", email.GetType()).ToString(), (new AppSettingsReader()).GetValue("SMPTPassword", email.GetType()).ToString());
            }

         
            
            if (adjunto1 != null)
            {
                mailMessage.Attachments.Add(adjunto1);
            }

            if (adjunto2 != null)
            {
                mailMessage.Attachments.Add(adjunto2);
            }

            try
            {
                smtpClient.Send(mailMessage);
            }
            catch (Exception e)
            {
                result.estado = false;
                result.mensaje = "Error al enviar correo: " + e.Message;

            }




            return result;

        }

        /// <summary>
        /// Envia correos tipo html 
        /// </summary>
        /// <param name="email">Correo</param>
        /// <param name="subject">Asunto</param>
        /// <param name="body">Contexto</param>
        /// <param name="adjunto1">Archivo adjunto 1</param>
        /// <param name="adjunto2">Archivo Adjunto 2</param>
        /// <returns></returns>
        public static Result enviarCorreoHtml(string email, string subject, string body, Attachment adjunto1 = null, Attachment adjunto2 = null)
        {
            Result result = new Result();
            result.estado = true;
            result.mensaje = "Ok";
            MailMessage mailMessage = new MailMessage();

            if (email != "")
            {
                mailMessage.To.Add(email);
                mailMessage.CC.Add((new AppSettingsReader()).GetValue("MailAdministrator", email.GetType()).ToString());
            }
            else
            {
                mailMessage.To.Add((new AppSettingsReader()).GetValue("MailAdministrator", email.GetType()).ToString());
            }
            mailMessage.Body = body;
            mailMessage.Sender = new MailAddress((new AppSettingsReader()).GetValue("MailAdministrator", email.GetType()).ToString());
            mailMessage.Subject = subject;
            mailMessage.Priority = MailPriority.Normal;
            mailMessage.From = new MailAddress("Administrador@biciq.gob.ec");

            mailMessage.IsBodyHtml = true;


            SmtpClient smtpClient = new SmtpClient();
            smtpClient.Host = (new AppSettingsReader()).GetValue("SMPTServer", email.GetType()).ToString();
            
            bool usar=true;

            var usarCredenciales = Convert.ToBoolean(new AppSettingsReader().GetValue("UsarCredencialesSMTP", usar.GetType()));

            if (usarCredenciales)
            {
                smtpClient.Credentials = new System.Net.NetworkCredential((new AppSettingsReader()).GetValue("SMPTUser", email.GetType()).ToString(), (new AppSettingsReader()).GetValue("SMPTPassword", email.GetType()).ToString());
            }

            //smtpClient.Timeout = 10000;

            //smtpClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);

            if (adjunto1 != null)
            {
                mailMessage.Attachments.Add(adjunto1);
            }

            if (adjunto2 != null)
            {
                mailMessage.Attachments.Add(adjunto2);
            }
            
            try
            {
               
               // smtpClient.SendAsync(mailMessage, "");
                smtpClient.Send(mailMessage);
            }
            catch (Exception e)
            {
                result.estado = false;
                result.mensaje = "Error al enviar correo: " + e.Message;

            }




            return result;

        }

        public static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
        {
            

           
        }
        /// <summary>
        /// Metodo que permite borrar un objeto
        /// </summary>
        /// <param name="objeto">Objeto</param>
        /// <param name="entityName"></param>
        /// <returns></returns>
        public Result borrarObjeto(Object objeto, string entityName)
        {
            Result result = new Result();
            try
            {

                using (BiciqContexto context = new BiciqContexto())
                {
                    
                    try
                    {
                        context.AttachTo(entityName, objeto);
                    }
                    catch (Exception)
                    {
                        context.CreateEntityKey(entityName, objeto);
                        context.AttachTo(entityName, objeto);
                    }

                    context.DeleteObject(objeto);

                    context.SaveChanges();

                    result.estado = true;
                    result.mensaje = "Ok";
                }
            }
            catch (Exception e)
            {

                result.estado = false;
                result.mensaje = e.Message;
            }
            return result;
        }

        public Result crearObjetoCliente(Object objeto, string nameentity)
        {
            Result result = new Result();
            try
            {

                using (BiciqContexto context = new BiciqContexto())
                {
                    context.AddObject(nameentity, objeto);

                    context.SaveChanges();

                    context.Detach(objeto);

                    result.estado = true;
                    result.mensaje = "Ok";
                }
               
                var cliente = objeto as Cliente;

                var fileContrato = HttpContext.Current.Server.MapPath("../Contrato/Contrato Usuarios.pdf");
                Attachment contrato = new Attachment(fileContrato);
              
                Attachment formulario = ArmarFormulario(cliente);

                
               
                //Comun.enviarCorreo(cliente.Email , "Pruebas envío email", CorreoInscripcion(cliente), contrato,formulario);
                Comun.enviarCorreoHtml(cliente.Email, "Registro Biciq", CorreoInscripcion(cliente));

                result.Objeto1 = cliente.NombresApellidos.Trim() + "FormularioIncripcionBiciq.docx";
            }
            catch (Exception e)
            {
                result.estado = false;
                result.mensaje = e.Message;
            }
            return result;
        }
        private Attachment ArmarFormulario(Cliente cliente)
        {
             Dictionary<string, string> diccionarioDatos = new Dictionary<string, string>();
             diccionarioDatos.Add("DATO A", cliente.Nombres);
             diccionarioDatos.Add("DATO B", cliente.Apellidos);
             diccionarioDatos.Add("DATO C", cliente.Identificacion);
             diccionarioDatos.Add("DATO D", cliente.FechaNacimiento.Value.ToString("dd/MM/yyyy"));
             using (BiciqContexto contexto = new BiciqContexto())
             {
                 diccionarioDatos.Add("DATO E", contexto.Pais.Where(p => p.id == cliente.PaisId).FirstOrDefault().Nombre);
             }
             diccionarioDatos.Add("DATO F", cliente.Sector);
             diccionarioDatos.Add("DATO G", cliente.Ocupacion);
             diccionarioDatos.Add("DATO H", cliente.NivelInstruccion);
             diccionarioDatos.Add("DATO I", cliente.LugarTrabajo);
             diccionarioDatos.Add("DATO J", cliente.DireccionLugarTrabajo);
             diccionarioDatos.Add("DATO K", cliente.Telefono);
             diccionarioDatos.Add("DATO L", cliente.Mobil);
             diccionarioDatos.Add("DATO M", cliente.Email);
             diccionarioDatos.Add("DATO N", cliente.Direccion);
             diccionarioDatos.Add("DATO O", cliente.NombreReferenciaF1);
             diccionarioDatos.Add("DATO P", cliente.DirecionReferenciaF1);
             diccionarioDatos.Add("DATO Q", cliente.NombreReferenciaF2);
             diccionarioDatos.Add("DATO R", cliente.DirecionReferenciaF2);
             diccionarioDatos.Add("DATO S", cliente.NombreReferenciaL1);
             diccionarioDatos.Add("DATO T", cliente.DirecionReferenciaL1);
            
             Attachment formulario = new Attachment(GeneraDocumento("FormularioInscripcion.docx", diccionarioDatos, cliente.NombresApellidos.Trim()+"FormularioIncripcionBiciq"));

             return formulario;
        }
        private string CorreoInscripcion(Cliente cliente)
        {
            StringBuilder builder = new StringBuilder();

            builder.Append("<body><p><strong>Estimad@ " + cliente.NombresApellidos + "</strong></p>");
            builder.AppendLine();
            builder.Append("<p><font class='swb'><strong>Gracias por registrarse al sistema de bicicleta pública BiciQ. </strong><br />");
            builder.Append("El servicio al cliente muy pronto tomará contacto para notificarte que ya eres usuario del sistema; con esto debes acercarte a cualquiera de las estaciones u ");
            builder.Append("oficinas administrativas ubicadas en la Joaquin Pinto Oe4-130 y Luis Cordero, y en Amazonas y Nuñez de Vela esquina, con los siguientes requisitos:<br />");
            builder.Append("</font> </p> <p> <font class='swb'>1. Descargar e Imprimir el formulario con los datos llenados por Ud. desde el sigiente enlace: <a href='http://50.63.58.66/SoftwareBiciq/FormularioGenerado/" + cliente.NombresApellidos.Trim() + "FormularioIncripcionBiciq.docx'  target='_blank'>Descargar Formulario</a><br />");
            builder.Append("2. Copia de la cédula de identidad o pasaporte <br /> ");
            builder.Append("3. Copia de la papeleta de votación <br />");
            builder.Append("4. Copia de una planilla de servicios básicos de su domicilio (luz, agua, teléfono)<br />");
            builder.Append("5. Descargar, leer, llenar e imprimir, el contrato de préstamo y uso de las bicicletas desde el siguiente enlace: <a href='https://emailmg.webhost4life.com/atmail/parse.pl?redirect=http://www.biciq.gob.ec%2Fcontrato.pdf' target='_blank'>www.biciq.gob.ec/contrato.pdf</a><br />");
            builder.Append("6. Para el caso de usuarios menores de edad y que hayan cumplido los 16 años, deberán acudir con su representante legal quien firmará la autorización y el contrato respectivo.<br />");
            builder.Append("&nbsp;&nbsp;&nbsp; En el caso de usuarios extranjeros residentes en el país por más de 3 meses deben presentar adicionalmente: <br />");
            builder.Append("7. Aval o responsabilidad del empleador, certificado del centro de estudios o referencia personal de un ecuatoriano. <br /></font></p>");
            builder.Append("</body>");
           

            return builder.ToString();

        }

        private string CorreoAceptado(Cliente cliente)
        {
            StringBuilder builder = new StringBuilder();
            builder.Append("Estimad@ " + cliente.NombresApellidos);
            builder.AppendLine();
            builder.Append("Ha sido aprobado dentro del Sistema de Bicicleta Pública, puede acercase con su mejor sonrisa para sacarle la foto y entregarle su Tarjeta BiciQ");
            builder.AppendLine();
           
          

            return builder.ToString();

        }
        private string CorreoRechazado()
        {
            StringBuilder builder = new StringBuilder();
            builder.Append("Todavia no podemos habilitarte en el sistema ya que nos faltan algunos datos");
            builder.AppendLine();
            builder.Append("Comunícate por favor al servicio al cliente o acercarte a las oficinas que quedan en la Joaquin Pinto Oe4-130 y Luis Cordero o Amazonas y Nuñez de Vela esquina.");
            builder.AppendLine();

         
            return builder.ToString();

        }

        public Result crearObjeto(Object objeto, string nameentity)
        {
            Result result = new Result();
            try
            {

                using (BiciqContexto context = new BiciqContexto())
                {
                    context.AddObject(nameentity, objeto);
                    
                    context.SaveChanges();
                    
                    context.Detach(objeto);

                    result.estado = true;
                    result.mensaje = "Ok";
                }
            }
            catch (Exception e)
            {
                result.estado = false;
                result.mensaje = e.Message;
            }
            return result;
        }
       public Result modificarObjeto(Object objeto, string nombreEntidad )
       {
           Result result = new Result();
           try
           {
               using (BiciqContexto context = new BiciqContexto())
               {
                   context.AttachTo(nombreEntidad, objeto);

                   var stateEntry = context.ObjectStateManager.GetObjectStateEntry(objeto);
                   foreach (var propertyName in stateEntry.CurrentValues
                                                .DataRecordInfo.FieldMetadata
                                                .Select(fm => fm.FieldType.Name))
                   {
                       stateEntry.SetModifiedProperty(propertyName);
                   }
                   context.SaveChanges();
                   context.Detach(objeto);

                   result.mensaje = "OK";
                   result.estado = true;

               }
           }
           catch (Exception e)
           {
               result.estado = false;
               result.mensaje = e.Message;
               
           }

           return result;
       }

       public static string GeneraDocumento(String documentoAnterior, Dictionary<string, string> campos, string nombre)
       {
            string strFileName="";
           try
           {
               var direccionOrigen = System.AppDomain.CurrentDomain.BaseDirectory.ToString() + @"Formulario\";
               var direccionDestino = System.AppDomain.CurrentDomain.BaseDirectory.ToString() + @"FormularioGenerado\";

               strFileName = String.Format("{0}{1}", direccionDestino, nombre + ".docx");

               if (File.Exists(strFileName))
               {
                   File.Delete(strFileName);
               }

               File.Copy(direccionOrigen + documentoAnterior, strFileName);

               String docText = string.Empty;
               using (WordprocessingDocument doc = WordprocessingDocument.Open(strFileName, true))
               {
                   MainDocumentPart mainPart = doc.MainDocumentPart;

                   using (StreamReader sr = new StreamReader(doc.MainDocumentPart.GetStream()))
                   {
                       docText = sr.ReadToEnd();
                   }

                   foreach (var item in campos)
                   {
                       docText = docText.Replace(item.Key, item.Value);
                   }

                   using (StreamWriter sw = new StreamWriter(doc.MainDocumentPart.GetStream(FileMode.Create)))
                   {
                       sw.Write(docText);
                   }
               }
           }
           catch (Exception ex)
           {
               nombre = string.Empty;
           }
           return strFileName;
       }

    }
    
}
